﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title>行为型模式</title>
	</head>
	<body>
		<a href="#hh2"><div style="border: 1px solid; width: 40px;margin-left: 80%;margin-top:50%;position: fixed;">
		<b>返回顶部</b>
	</div></a>
		<h2 id="hh2"><a href="结构型模式.html" style="font-size:10px">上一个</a>&nbsp;&nbsp;行为型模式</h2>
		<pre>行为型模式是对在不同对象之间划分责任和算法的抽象化。行为模式不仅仅关于类和对象，还关于它们之间的相互作用。行为型模式又分为类的行为模式和对象的行为模式两种。</pre>
		<div>
			<ul>
				<li>类的行为模式——使用继承关系在几个类之间分配行为。</li>
				<li>对象的行为模式——使用对象聚合的方式来分配行为。</li>
			</ul>
		</div>
		<span>行为型模式包括11种模式：
			<a href="#a">模板方法模式</a>、
			<a href="#b">命令模式</a>、
			<a href="#c">迭代器模式</a>、
			<a href="#d">观察者模式</a>、
			<a href="#e">中介者模式</a>、
			<a href="#f">状态模式</a>、
			<a href="#g">策略模式</a>、
			<a href="#h">责任链模式</a>、
			<a href="#i">访问者模式</a>、
			<a href="#j">解释器模式</a>、
			<a href="#k">备忘录模式</a>
		</span>
		<div>
			<ul>
				<li>模板方法模式：封装算法结构，定义算法骨架，支持算法子步骤变化。</li>
				<li>命令模式：注重将请求封装为对象，支持请求的变化，通过将一组行为抽象为对象，实现行为请求者和行为实现者之间的解耦。</li>
				<li>迭代器模式：注重封装特定领域变化，支持集合的变化，屏蔽集合对象内部复杂结构，提供客户程序对它的透明遍历。</li>
				<li>观察者模式：注重封装对象通知，支持通信对象变化，实现对象状态改变，通知依赖它的对象并更新。</li>
				<li>中介者模式：注重封装对象见的交互，通过封装一系列对象之间的复杂交互，使他们不需要显示相互引用，实现解耦。</li>
				<li>状态模式：注重封装与状态相关的行为，支持状态的变化，通过封装对象状态，从而在其内部状态改变时改变它的行为。</li>
				<li>策略模式：注重封装算法，支持算法的变化，通过封装一系列算法，从而可以随时独立于客户替换算法。</li>
				<li>责任链模式：注重封装对象责任，支持责任的变化，通过动态构建职责连，实现事务处理。</li>
				<li>访问者模式：注重封装对象操作变化，支持在运行时为类结构添加新的操作，在类层次结构中在不改变各类的前提下定义作用于这些类实现的新的操作。</li>
				<li>备忘录模式：注重封装对象状态变化，支持状态保存，恢复</li>
				<li>解释器模式：注重封装特定领域变化，支持领域问题的频繁变化，将特定领域的问题表达为某种语法规则下的句子，然后构建一个解释器来解释这样的句子，从而达到解决问题的目的。</li>
			</ul>
		</div>
	<div>
		<h3 id="a">模板方式模式</h3>
<pre>
  介绍：
  	在一个抽象类中定义一个操作算法的骨架，将一些步骤延迟到子类中去实现。
  备注：
  	定不变的封装到抽象类中，需要改变的在子类中去实现。
  常用场景：一批子类的功能有可提取的公共算法骨架
  选择关键点：算法骨架是否牢固
  逆鳞：-
</pre>
	</div>
	<div>
		<h3 id="b">命令模式</h3>
		<pre>
  介绍：
  	命令模式是把一个操作或者行为抽象为一个对象中，通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开。
  备注：
  	将命令的接受者、发送者、具体命令、执行要求分开。具体命令抽象
  常用场景：行为的请求者与行为的处理者耦合度过高
  选择关键点：请求者是否不需要关心命令的执行只知道接受者
  逆鳞：命令种类的无限增长
		</pre>
	</div>
	<div>
		<h3 id="c">迭代器模式</h3>
		<pre>
  介绍：
  迭代器模式提供了一种方法顺序访问一个聚合对象（理解为集合对象）中各个元素，而又无需暴露该对象的内部表示，这样既可以做到不暴露集合的内部结构，又可让外部代码透明地访问集合内部的数据。
  备注：
  聚合对象，如需要操作。则额外建立一个迭代器类。对集合进行操作处理
		</pre>
	</div>
	<div>
		<h3 id="d">观察者模式</h3>
		<pre>
  介绍：
  	观察者模式定义了一种一对多的依赖关系，让多个观察者对象同时监听某一个主题对象，这个主题对象在状态发生变化时，会通知所有观察者对象，使它们能够自动更新自己的行为。
  备注：
  	信息传递机制进行解耦操作，传递的均是信息接口
  常用场景：需要将观察者与被观察者解耦或是观察者的种类不确定
  选择关键点：观察者与被观察者是否是多对一的关系
  逆鳞：观察者之间有过多的细节依赖
		</pre>
	</div>
	<div>
		<h3 id="e">中介者模式</h3>
		<pre>
  介绍：
  	定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用，从而使耦合性降低，而且可以独立地改变它们之间的交互行为
  备注：
  	禁止类之间相互交互，封装个各类之间的行为
  常用场景：一个系列的对象交互关系十分复杂
  选择关键点：复杂的交互关系是否有共性可被中介者承担
  逆鳞：中介者无法工作
		</pre>
	</div>
	<div>
		<h3 id="f">状态模式</h3>
		<pre>
  介绍：
  	允许一个对象在其内部状态改变时自动改变其行为，对象看起来就像是改变了它的类。
  备注：
  	由于状态的改变，会改变派生类，产生不同的重载方法。
  常用场景：一个对象在多个状态下行为不同，且这些状态可互相转换
  选择关键点：这些状态是否经常在运行时需要在不同的动态之间相互切换
  逆鳞：-
		</pre>
	</div>
	<div>
		<h3 id="g">策略模式</h3>
		<pre>
  介绍：
  	策略模式是针对一组算法，将每个算法封装到具有公共接口的独立的类中，从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
  备注：
  	将方法或者算法，抽象成类，有区别的算法对这个类进行继承。然后多态去实现
  常用场景：算法或策略需要经常替换
  选择关键点：客户端是否依赖于某一个或若干个具体的策略
  逆鳞：-
		</pre>
	</div>
	<div>
		<h3 id="h">责任链模式</h3>
		<pre>
  介绍：
  	某个请求需要多个对象进行处理，从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链子，并沿着这条链子传递该请求，直到有对象处理它为止。
  备注：
  	审批人抽象，派生类中定义上级人员。调用时，制定上级人员。当请求不满足时，根据自动跳转上级人员。调用从最低开始。
  常用场景：一个请求的处理需要多个对象当中的一个或几个协作处理。
  选择关键点：对于每一个请求是否每个处理的对象都需要一次处理机会。
  逆鳞：-
		</pre>
	</div>
	<div>
		<h3 id="i">访问者模式</h3>
		<pre>
  介绍：
  	数据结构的每一个节点都可以接受一个访问者的调用，此节点向访问者对象传入节点对象，而访问者对象则反过来执行节点对象的操作。
  备注：
  	真个数据结构的方法与数据结构分离，定义访问类去找他的方法。
  常用场景：作用于一个数据结构之上的操作经常变化
  选择关键点：数据结构是否稳定以及操作是否经常变化
  逆鳞：数据结构的不稳定
		</pre>
	</div>
	<div>
		<h3 id="j">备忘录模式</h3>
		<pre>
  介绍：
  	在不破坏封装的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，这样以后就可以把该对象恢复到原先的状态。
  备注：
  	对象保存静态，可用list进行扩展，类似于撤消操作
  常用场景：需要在对象的外部保存该对象的内部状态
  选择关键点：是否可以在必要的时候捕捉到对象的内部状态
  逆鳞：大对象的备份
		</pre>
	</div>
	<div>
		<h3 id="k">解释器模式</h3>
		<pre>
  介绍:
  	解释器模式描述了如何为简单的语言定义一个文法，如何在该语言中表示一个句子，以及如何解释这些句子。
  备注：
  	使用键值对，转换对应的语言
  常用场景：有一种语言被频繁的使用
  选择关键点：被频繁使用的语言是否可用文法表示
  逆鳞：语言的规则无限制增长或规则十分不稳定
		</pre>
	</div>
	</body>
</html>